/**
 * Define a grammar called Hello
 */
grammar ques;
@header {
	package queryfish.db.query;
}

WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines

scienceName: 'tên khoa học';
sameName: 'tên đồng danh';
engName: 'tên tiếng anh' | 'tên tiếng anh khác';
vnName: 'tên tiếng việt' | 'tên tiếng việt khác';
imageName: 'tên kiểu hình';
commonName: 'tên phổ biến';
name: scienceName | sameName | engName | vnName | imageName | commonName;

mossRequest: 'yêu cầu hồ rong';
lightRequest: 'yêu cầu ánh sáng';
waterFilterRequest: 'yêu cầu lọc nước';
aerationRequest: 'yêu cầu sục khí';
request: mossRequest | lightRequest | waterFilterRequest | aerationRequest;

waterTemparature: 'nhiệt độ nước' | 'nhiệt độ';
dH: 'dH' | 'độ dH' | 'độ cứng nước';
pH: 'pH' | 'độ pH';
waterRequest: waterTemparature | dH | pH;

fishSet: 'bộ' | 'bộ cá';
fishClass: 'họ' | 'họ cá';
kindOfFish: 'loài' | 'loài cá';
subspecies: fishSet | fishClass | kindOfFish;

longFish: 'chiều dài'|'chiều dài cá'| 'chiều dài trung bình' | 'chiều dài trung bình cá'|
			'kích thước' | 'kích thước cá' | 'kích thước trung bình' | 'kích thước cá trung bình'|
			'kích thước trung bình cá' | 'chiều dài cá trung bình';

orgination: 'nguồn gốc';

distribution: 'phân bố';

waterField: 'tầng nước sống';

designAquarium: 'thiết kế bể' | 'thiết kế' | 'bể'; // ***************

kindOfFood: 'thức ăn' | 'loại thức ăn';

caring: 'chăm sóc' | 'chăm';

generalInfo: 'thông tin' | 'thông tin chung';

biology: 'đặc điểm sinh học' | 'đặc điểm';

cultureTech: 'kỹ thuật nuôi' | 'nuôi' | 'cách nuôi';

repronduction: 'sinh sản' | 'đặc tính sinh sản';

classification: 'phân loại' | 'chi tiết phân loại';

verbPharseStartQues1: 'cho biết' | 'hãy cho biết';
verbPharseStartQues2: 'nêu' | 'hãy nêu';
verbPharseStartQues3: 'hướng dẫn' | 'hướng';

iN: 'của';
inIn: 'trong';
inCan: 'có thể';
inFor: 'cho';

nnFish: 'cá';
nnAquarium: 'bể';
nnWater: 'nước';

vbBe: 'là';
vbHave: 'có';
vbOf: 'thuộc';
vbLive: 'sống';
vbFeed: 'nuôi';
vbGet: 'được';
vbEat: 'ăn';
vbNeed: 'cần';

advTo: 'để';

dtThe: 'những';

where01: 'ở đâu';
where02: 'từ đâu' | 'khu vực nào';

expletive01: 'là' ('gì')?;
expletive02: 'như thế nào';
expletive03: 'nào' | 'gì';
expletive04: 'nào thế';
expletive05: 'thế nào';
expletive06: ('là')? 'bao nhiêu';
expletive07: 'được';

endQues01: expletive01 '?';
endQues02: '?';
endQues03: (expletive02) '?';
endQues04: (expletive04) '?';
endQues05: (expletive05) '?';
endQues06: (expletive03)'?';
endQues07: (expletive06) '?';
endQues08: (expletive07) '?';


D: 'á'|'à'|'ả'|'ã'|'ạ'|
   'â'|'ấ'|'ầ'|'ẩ'|'ẫ'|'ậ'|
   'ă'|'ắ'|'ằ'|'ẳ'|'ẵ'|'ặ'|
   'é'|'è'|'ẻ'|'ẽ'|'ẹ'|
   'ê'|'ế'|'ề'|'ể'|'ễ'|'ệ'|
   'ú'|'ù'|'ủ'|'ũ'|'ụ'|
   'ư'|'ứ'|'ừ'|'ử'|'ữ'|'ự'|
   'í'|'ì'|'ỉ'|'ĩ'|'ị'|
   'ó'|'ò'|'ỏ'|'õ'|'ọ'|
   'ô'|'ố'|'ồ'|'ổ'|'ỗ'|'ộ'|
   'ơ'|'ớ'|'ờ'|'ở'|'ỡ'|'ợ'|
   'đ';

A: 'Á'|'À'|'Ả'|'Ã'|'Ạ'|
   'Â'|'Ấ'|'Ầ'|'Ẩ'|'Ẫ'|'Ậ'|
   'Ă'|'Ắ'|'Ằ'|'Ẳ'|'Ẵ'|'Ặ'|
   'É'|'È'|'Ẻ'|'Ẽ'|'Ẹ'|
   'Ê'|'Ế'|'Ề'|'Ể'|'Ễ'|'Ệ'|
   'Ú'|'Ù'|'Ủ'|'Ũ'|'Ụ'|
   'Ư'|'Ứ'|'Ừ'|'Ử'|'Ữ'|'Ự'|
   'Í'|'Ì'|'Ỉ'|'Ĩ'|'Ị'|
   'Ó'|'Ò'|'Ỏ'|'Õ'|'Ọ'|
   'Ô'|'Ố'|'Ồ'|'Ổ'|'Ỗ'|'Ộ'|
   'Ơ'|'Ớ'|'Ờ'|'Ở'|'Ỡ'|'Ợ'|
   'Đ';
N1: (A D? ([a-z]+)? D? ([a-z]+)?);
N2: ([A-Z] ([a-z]+)? (D+)?([a-z]+)?);
N3: [A-Z] ([a-z]+);
nameFish: ((N1|N2)+)|(N3+);

info01: name | request | repronduction | waterField | generalInfo | repronduction| 
		biology | classification | cultureTech | kindOfFood | subspecies;

info02:	orgination | designAquarium | repronduction;
		
questionWh01: (verbPharseStartQues1|verbPharseStartQues2)? info01 (iN)? nnFish nameFish endQues01;

questionWh02: (verbPharseStartQues1|verbPharseStartQues2)? (info02|info01|caring|distribution) (iN)? nnFish nameFish endQues02;

questionWh03: (verbPharseStartQues1)? nnFish nameFish vbBe nnFish (endQues03|endQues02|endQues04|endQues06);

questionWh04: (verbPharseStartQues1)? nnFish nameFish vbHave info01 endQues01;

questionWh05: (verbPharseStartQues1)? nnFish (expletive03)? vbHave name (vbBe)? nameFish endQues02;

questionWh06: (verbPharseStartQues1)? (nnFish)? nameFish vbBe name iN nnFish (endQues02|endQues04|endQues06);

questionWh07: (verbPharseStartQues1)? nnFish nameFish vbHave (info01|info02) (endQues05|endQues03);

questionWh08: (verbPharseStartQues1)? nnFish nameFish vbOf subspecies (endQues04|endQues06);

questionWh09: (verbPharseStartQues1|verbPharseStartQues2)? (info01|info02) (iN)? nnFish nameFish (endQues05|endQues03); 

questionWh10: (verbPharseStartQues1)? nnFish nameFish vbHave (orgination|waterField) where01 endQues02;

questionWh11: (verbPharseStartQues1)? nnFish nameFish vbHave (orgination|distribution) where02 endQues02;

questionWh12: (verbPharseStartQues1)? nnFish nameFish vbHave (waterRequest|longFish) endQues07;

questionWh13: (verbPharseStartQues1)? nnFish nameFish vbLive inIn waterRequest endQues07;

questionWh14: (verbPharseStartQues1)? waterRequest (advTo)? vbFeed nnFish nameFish endQues07;

questionWh15: (verbPharseStartQues1)? nnFish nameFish vbLive inIn nnWater vbHave waterRequest endQues07;

questionWh16: (verbPharseStartQues1)? nnFish nameFish vbGet (caring|designAquarium|cultureTech|request) (endQues05|endQues03);

questionWh17: (verbPharseStartQues1)? nnAquarium vbFeed (iN)? nnFish nameFish vbHave (designAquarium|request|waterRequest) (endQues05|endQues03);

questionWh18: (verbPharseStartQues1|verbPharseStartQues2)? (dtThe)? kindOfFood (expletive03)? (inCan)? inFor nnFish nameFish vbEat (endQues02|endQues08);

questionWh19: (verbPharseStartQues1)? nnFish nameFish (vbNeed)? (expletive07)? (caring|cultureTech|designAquarium|kindOfFood) (endQues05|endQues03);

questionWh20: verbPharseStartQues3 (designAquarium|caring|cultureTech) nnFish nameFish endQues02;

question : questionWh01 | questionWh02 | questionWh03 |
			questionWh04| questionWh05 | questionWh06 |
			questionWh07 | questionWh08|questionWh09 | questionWh10 | questionWh11 |
			questionWh12| questionWh13 | questionWh14 |
			questionWh15 | questionWh16|questionWh17 | questionWh18 | questionWh19 |
			questionWh20;
//questionWh09: (verbPharseStartQues1|verbPharseStartQues2)? 	

